void main() {
  //mixin译作混入，意思是代码中混入其他的代码，原则上是代码重用的一种方式
  //dart中不支持多继承，但是可以通过with来实现一个类具有多个类的特性
  //1、with的类可以是mixin修饰的类，也可以是普通的类或者抽象类,但是如果是普通类或者抽象类，该类不可以有构造函数，factory构造函数除外
  Class01 class01 = Class01(12);
  class01.run();
  print(class01.age);
  //2、mixin修饰的类不可以有任何形式的构造函数
  //3、mixin修饰的类可以通过on来限定子类继承自哪个类，此时可以通过super来调用该子类的父类的方法及属性
  Class02 class02 = Class02('jack', 20);
  class02.eat();
  class02.run();
  //4、with的类里面的属性，无法在简化构造函数中赋值，只能在代码块中赋值（不知为什么），如Class01、Class0
  //5、如果一个类继承与with多个类，这些类有相同的属性或者方法
  //  1:如果该类中有重写，以该类中为准
  //  2:如果没有重写，with(with后面的>前面的)>extends
  ClassO7 class07 = ClassO7();
  class07.eat();
  class07.run();
  print(class07.name);
}

class Person {
  String name;

  Person(this.name);

  void eat() {
    print('eat');
  }
}

mixin Mixin1 {
  int age;

  void run() {
    print('run');
  }
}

mixin Mixin2 on Person {
  int age;

  void run() {
    super.eat();
    print('run');
  }
}

class Class01 with Mixin1 {
  Class01(int age) {
    this.age = age;
  }

//  Class01(this.age);//报错，age不是该类的属性
}

class Class02 extends Person with Mixin2 {
  Class02(String name, int age) : super(name) {
    this.age = age;
  }
}

abstract class ClassO3{
  String name = 'ClassO3';
  void eat(){
    print('eat in ClassO3');
  }

  void run(){
    print('run in ClassO3');
  }
}

abstract class ClassO4{
  void eat();
}

class ClassO5{
  String name = 'ClassO5';
  void eat(){
    print('eat in ClassO5');
  }

  void run(){
    print('run in ClassO5');
  }
}

class ClassO6{
  String name = 'ClassO6';
  void eat(){
    print('eat in ClassO6');
  }

  void run(){
    print('run in ClassO6');
  }
}

class ClassO7 extends ClassO3 with ClassO5, ClassO6 implements ClassO4{
  void eat(){
    print('eat in ClassO7');
  }
}



